package GUI;

import java.awt.Dialog.ModalityType;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.print.PrinterException;

import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;

import Verwaltung.Daten.Aktivitaet;

/**
 * 
 * @author MaximumDataOverdrive
 * 
 */
public class StundenplanerFrame extends JFrame implements ActionListener {

	private JTable table;
	private JScrollPane scrollPane;
	private JComboBox<String> lehrerKlassenComboBox;
	private JPanel SeitenPanel;
	private JButton btnDrucken;

	private StundenplanTableModel model = null;

	/**
	 * Create the application.
	 */
	public StundenplanerFrame() {
		initialize();
	}

	/**
	 * Initialize the contents of the frame.
	 */
	private void initialize() {

		setBounds(100, 100, 800, 600);
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		final GridBagLayout gridBagLayout = new GridBagLayout();
		gridBagLayout.columnWidths = new int[] { 600, 185, 0 };
		gridBagLayout.rowHeights = new int[] { 20, 500, 0, 0 };
		gridBagLayout.columnWeights = new double[] { 0.0, 0.0, Double.MIN_VALUE };
		gridBagLayout.rowWeights = new double[] { 0.0, 1.0, 0.0,
				Double.MIN_VALUE };
		getContentPane().setLayout(gridBagLayout);
		final GridBagConstraints gbc_lehrerKlassenComboBox = new GridBagConstraints();
		gbc_lehrerKlassenComboBox.fill = GridBagConstraints.HORIZONTAL;
		gbc_lehrerKlassenComboBox.insets = new Insets(0, 0, 5, 5);
		gbc_lehrerKlassenComboBox.gridx = 0;
		gbc_lehrerKlassenComboBox.gridy = 0;
		getContentPane().add(getLehrerKlassenComboBox(),
				gbc_lehrerKlassenComboBox);

		final GridBagConstraints gbc_scrollPane = new GridBagConstraints();
		gbc_scrollPane.fill = GridBagConstraints.BOTH;
		gbc_scrollPane.insets = new Insets(5, 5, 5, 5);
		gbc_scrollPane.gridx = 0;
		gbc_scrollPane.gridy = 1;
		getContentPane().add(getScrollPane(), gbc_scrollPane);
		final GridBagConstraints gbc_SeitenPanel = new GridBagConstraints();
		gbc_SeitenPanel.insets = new Insets(0, 0, 5, 0);
		gbc_SeitenPanel.fill = GridBagConstraints.BOTH;
		gbc_SeitenPanel.gridx = 1;
		gbc_SeitenPanel.gridy = 1;
		getContentPane().add(getSeitenPanel(), gbc_SeitenPanel);
		final GridBagConstraints gbc_btnDrucken = new GridBagConstraints();
		gbc_btnDrucken.insets = new Insets(0, 0, 0, 5);
		gbc_btnDrucken.gridx = 0;
		gbc_btnDrucken.gridy = 2;
		getContentPane().add(getBtnDrucken(), gbc_btnDrucken);
	}

	/**
	 * Scroll-Pannel für den Stundenplan
	 * 
	 * @return ScrollPane Scroll-Pannel des Stundenplanes
	 */
	private JScrollPane getScrollPane() {
		if (scrollPane == null) {
			scrollPane = new JScrollPane();
			final StundenplanTableModel stundenplanModel = new StundenplanTableModel();
			model = stundenplanModel;
			table = new JTable(stundenplanModel);
			scrollPane.setViewportView(table);
			table.setRowHeight(50);
			table.setDefaultRenderer(Aktivitaet.class,
					new PlanTableCellRenderer());
			final StundenplanerFrame frame = this;
			table.addMouseListener(new MouseListener() {

				@Override
				public void mouseReleased(final MouseEvent arg0) {

				}

				@Override
				public void mousePressed(final MouseEvent arg0) {

				}

				@Override
				public void mouseExited(final MouseEvent arg0) {

				}

				@Override
				public void mouseEntered(final MouseEvent arg0) {

				}

				/**
				 * Methode die beim Linken Maus-Klick auf das Event, falls das
				 * Zugriffslevel es erlaubt, die Aktivität bearbeiten lässt.
				 */
				@Override
				public void mouseClicked(final MouseEvent arg0) {

					if (arg0.getButton() == MouseEvent.BUTTON3) {

						if (StundenplanController.getInstance()
								.getRechteController().getLoginlevel() >= 0) {

							final int col = table.columnAtPoint(arg0.getPoint());
							final int row = table.rowAtPoint(arg0.getPoint());

							final Object value = table.getValueAt(row, col);

							if (value instanceof Aktivitaet) {
								final AktivitaetBearbeiten dia = new AktivitaetBearbeiten(
										frame, (Aktivitaet) value);
								dia.pack();
								dia.setModalityType(ModalityType.APPLICATION_MODAL);
								dia.setLocationRelativeTo(null);
								dia.setVisible(true);
							}
						}
					}
				}
			});
		}
		return scrollPane;
	}

	/**
	 * Diese Methode gibt die ComboBox mit den Lehrern und Klassen zurück, die
	 * in der Datenbank vorhanden sind. Gibt es diese nicht, wird diese neu
	 * initialisert.
	 * 
	 * @return lehrerKlassenComboBox ComboBox mit den Lehrern und Klassen die in
	 *         der Datenbank vorhanden sind.
	 */
	public JComboBox<String> getLehrerKlassenComboBox() {
		if (lehrerKlassenComboBox == null) {
			lehrerKlassenComboBox = new JComboBox<String>();

			lehrerKlassenComboBox.addActionListener(this);
		}
		return lehrerKlassenComboBox;
	}

	/**
	 * Grafisches Element, fungiert als Rahmen
	 * 
	 * @return SeitenPanel Rahmen
	 */
	public JPanel getSeitenPanel() {
		if (SeitenPanel == null) {
			SeitenPanel = new JPanel();
		}
		return SeitenPanel;
	}

	/**
	 * Diese Methode gibt den Button: btnDrucken zurück. Existiert dieser nicht,
	 * wird er neu initialisert.
	 * 
	 * @return btnDrucken Button der das Drucken des Stundenplanes ermöglicht.
	 */
	public JButton getBtnDrucken() {
		if (btnDrucken == null) {
			btnDrucken = new JButton("Drucken");
			btnDrucken.addActionListener(new ActionListener() {

				@Override
				public void actionPerformed(final ActionEvent arg0) {

					try {
						table.print();
					} catch (final PrinterException e) {
						JOptionPane
								.showMessageDialog(null,
										"Fehler beim Ausdrucken. Kein Drucker gefunden");
						e.printStackTrace();
					}

				}
			});
		}
		return btnDrucken;
	}

	/**
	 * Diese Methode lässt den StundenlpanController dieses Frames updaten.
	 */
	@Override
	public void actionPerformed(final ActionEvent arg0) {

		StundenplanController.getInstance().update();

	}

	/**
	 * Diese Methode gibt die Tabelle des Stundenpanes zurück.
	 * 
	 * @return model Die Tabelle des Stundenplans
	 */
	public StundenplanTableModel getTableModel() {
		return model;
	}
}
